package com.suyang.mongo.dao;

import java.util.List;

import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

public interface BaseMongoDao<T> {
	/**
	 * 保存一个对象
	 * 
	 * @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy
	 *         Right since 2013-10-13 下午03:37:28
	 * 
	 * @param t
	 * @return
	 */
	public void save(T t);

	/**
	 * 根据Id从Collection中查询对象
	 * 
	 * @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy
	 *         Right since 2013-10-17 下午01:59:55
	 * 
	 * @param id
	 *            实体对象的Id,对应Collection中记录的_id字段.
	 *            <p>
	 *            需要说明的是,Mongdo自身没有主键自增机制.解决方法
	 *            <ol>
	 *            <li>实体入库的时候,程序中为实体赋主键值.
	 *            <li>实体入库的时候,在mongodb中自定义函数实现主键自增机制.定义方法同js代码类似
	 *            </ol>
	 *            </p>
	 * @return
	 */
	public T queryById(String id);

	/**
	 * 根据条件查询集合
	 * 
	 * @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy
	 *         Right since 2013-10-13 下午03:32:54
	 * 
	 * @param query
	 *            查询条件
	 * @return 满足条件的集合
	 */
	public List<T> queryList(Query query);

	/**
	 * 通过条件查询单个实体
	 * 
	 * @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy
	 *         Right since 2013-10-13 下午03:33:12
	 * 
	 * @param query
	 * @return
	 */
	public T queryOne(Query query);

	/**
	 * 通过条件进行分页查询
	 * 
	 * @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy
	 *         Right since 2013-10-13 下午03:33:30
	 * 
	 * @param query
	 *            查询条件
	 * @param start
	 *            查询起始值 <strong> 类似mysql查询中的 limit start, size 中的 start</strong>
	 * @param size
	 *            查询大小 <strong> 类似mysql查询中的 limit start, size 中的 size</strong>
	 * @return 满足条件的集合
	 */
	public List<T> getPage(Query query, int start, int size);

	/**
	 * 根据条件查询库中符合记录的总数,为分页查询服务
	 * 
	 * @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy
	 *         Right since 2013-10-13 下午03:35:44
	 * 
	 * @param query
	 *            查询条件
	 * @return 满足条件的记录总数
	 */
	public Long getPageCount(Query query);

	/**
	 * 根据Id删除用户
	 * 
	 * @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy
	 *         Right since 2013-10-13 下午04:09:20
	 * 
	 * @param id
	 */
	public void deleteById(String id);

	/**
	 * 删除对象
	 * 
	 * @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy
	 *         Right since 2013-10-13 下午03:45:33
	 * 
	 * @param t
	 */
	public void delete(T t);

	/**
	 * 更新满足条件的第一个记录
	 * 
	 * @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy
	 *         Right since 2013-10-13 下午03:47:10
	 * 
	 * @param query
	 * @param update
	 */
	public void updateFirst(Query query, Update update);

	/**
	 * 更新满足条件的所有记录
	 * 
	 * @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy
	 *         Right since 2013-10-13 下午03:48:02
	 * 
	 * @param query
	 * @param update
	 */
	public void updateMulti(Query query, Update update);

	/**
	 * 查找更新,如果没有找到符合的记录,则将更新的记录插入库中
	 * 
	 * @author <a href='mailto:dennisit@163.com'>Cn.苏若年(En.dennisit)</a> Copy
	 *         Right since 2013-10-13 下午03:48:58
	 * 
	 * @param query
	 * @param update
	 */
	public void updateInser(Query query, Update update);
}
